#include <iostream>
#include <cstring> // 用于strcpy等字符串函数


int main()
{
    // 1 分配数组
    int *str = new int[3]; // 动态分配一个int类型的内存空间，初始值为0
    for(int i = 0; i < 3; i++)
    {
        str[i] = i;
    }
    for(int i = 0; i < 3; i++)
    {
        std::cout << str[i] << " ";
    }
 
    std::cout << std::endl;


    // 2 分配字符串
    char *str1 = new char[10]; // 动态分配一个char类型的内存空间，初始值为0

    strcpy(str1, "Hello hhhhhhadb"); // 复制字符串到分配的内存
    std::cout << str1 << std::endl; // 输出"Hello World"

    // 3 分配二维数组
    int (*p)[3] = new int[3][3]{1,2,3,4,5,6,7,8,9}; // 动态分配一个10x10的char类型的内存空间，初始值为0
    for(int x=0;x<3;x++)
    {
        for(int y=0;y<3;y++)
        {
            // p[x][y] = x+y;
            std::cout << p[x][y] << " ";
        }
        std::cout << std::endl;
    }

    // 练习
    // 栈空间(自己定义变量)
    char name[3][10] = {"小明","小红","小刚"}; // 动态分配一个char类型的内存空间，初始值为0
    // 栈空间可以直接输出
    for(int i = 0; i < 3; i++)
    {
        std::cout << name[i] << " ";
    }
    std::cout << std::endl;

    // 堆空间(动态分配内存)
    char (*p1)[10] = new char[3][10]; // 动态分配一个char类型的内存空间，初始值为0
    strcpy(p1[0], "小明");
    strcpy(p1[1], "小红");
    strcpy(p1[2], "小刚");
    for(int i = 0; i < 3; i++)
    {
        std::cout << p1[i] << " ";
    }
    std::cout << std::endl;



    delete[] str; // 释放内存空间
    delete[] str1; // 释放内存空间
    delete[] p; // 释放内存空间
    delete[] p1; // 释放内存空间

    return 0;
}